/*
 * Parser.java
 * 定义（客户端）命令解析的（静态）函数，解析完成后返回相应的对象
 */
import java.util.*;
import java.util.regex.*;

public class Parser {
    /**
     * @return 返回解析后的对象，如果命令格式错误，返回空
     * 主调函数要判断是否是 End 对象
     */
    public static Object parse(String cmd)
    {
        cmd = cmd.trim();
        
        /* 命令为空 */
        if (cmd.length() == 0) {
            return null;
        }
        
        /* 广播消息 */
        if (cmd.charAt(0) != '/') {
            return new BroadcastMsg(cmd);
        }
        
        /* 斜杠开头的命令，参数解析 */
        Scanner scn = new Scanner(cmd);
        String verb = scn.next();
        Object ret = null;
        
        /* 退出 */
        if (verb.equals("/exit")) {
            ret = new End();
            
        /* 私聊 */
        } else if (verb.equals("/private")) {
            String args = scn.nextLine().trim();
            Pattern pat_name_with_quot = Pattern.compile("(\"[^\"\\n]+\")(.+)");
            Pattern pat_single_word_name = Pattern.compile("([^\"\t ]+)\\s+(.+)");
            Matcher m1, m2;
            
            if ((m1 = pat_name_with_quot.matcher(args)).matches()) {
                ret = new PrivateMsg(rm_quot(m1.group(1)), m1.group(2).trim());
            } else if ((m2 = pat_single_word_name.matcher(args)).matches()) {
                ret = new PrivateMsg(m2.group(1), m2.group(2).trim());
            }
        }
        scn.close();
        return ret;
    }
    
    /**
     * @param src 首尾都是（半角）双引号且长度大于 2 的字符串
     */
    private static String rm_quot(String src)
    {
        return src.substring(1, src.length() - 1);
    }
}